package com.java.stack;

/**
 * 栈的学习
 * 使用数组来模拟栈
 * @author 19252
 */
public class ArrayStackDemo {
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack(5);
        stack.showStack();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(6);
        System.out.println("============> 入栈 <===========");
        stack.showStack();
        stack.pop();
        stack.pop();
        stack.push(6);
        System.out.println("============> 出栈 <===========");
        stack.showStack();
        System.out.println("============> 出栈判空 <===========");
        stack.pop();
        stack.pop();
        stack.pop();
        stack.pop();
        stack.pop();
        stack.pop();

    }
}

/**
 * 栈的数组模拟
 */
class ArrayStack {

    /**
     * 栈的大小
     */
    private int maxSize;

    /**
     * 栈
     */
    private int[] stack;

    /**
     * 栈的指针
     */
    private int top = -1;

    public ArrayStack() {
    }

    /**
     * 构造函数，对栈进行初始化
     * @param maxSize 栈的大小
     */
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        this.stack = new int[maxSize];
    }

    public int getMaxSize() {
        return maxSize;
    }

    /**
     * 设置栈的大小
     * @param maxSize 栈的大小
     */
    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
        this.stack = new int[maxSize];
    }

    /**
     * 栈的判满
     * @return 栈是否满 true 已满；false 未满
     */
    public boolean isFull(){
        return top == maxSize - 1;
    }

    /**
     * 栈的判空
     * @return 栈是否空 true 为空；false 不空
     */
    public boolean isEmpty(){
        return top == -1;
    }

    /**
     * 数据入栈
     * @param value 数据
     */
    public void push(int value){
        if (isFull()){
            System.out.println("栈已满不能再添加数据！");
            return;
        }
        top ++;
        stack[top] = value;
    }

    /**
     * 数据出栈
     * @return 出栈的数据
     */
    public int pop(){
        if (isEmpty()){
            throw new RuntimeException("栈为空，没有数据可以输出！");
        }
        int value = stack[top];
        top --;
        return value;
    }

    /**
     * 栈的遍历
     */
    public void showStack(){
        if (isEmpty()){
            System.out.println("栈为空，没有数据可以输出！");
            return;
        }
        for (int i = top; i >= 0; i --) {
            System.out.printf("sack[%d] = %d \n", i, stack[i]);
        }
    }

}
